/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */

package jp.ize.ux.components;
// {{{ imports
import flash.display.Loader;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.SecurityErrorEvent;
import jp.ize.ux.UXController;
import jp.ize.ux.components.UXComponent;
import jp.ize.ux.states.UXBasicState;
import jp.ize.ux.geom.UXSize;
// }}}
// {{{ class UXImage extends UXComponent<UXBasicState>
/**
 * UXImageクラス<br>
 * JPEG、SVG、PNG、GIF の各形式のイメージおよび SWF ファイルを読み込んで表示するオブジェクトです。<br>
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class UXImage extends UXComponent<UXBasicState>
{
	// {{{ private var _loader:flash.display.Loader;

	private var _loader:flash.display.Loader;
	// }}}
	// {{{ public var source(default, default) : String;
	/**
	 * ソースファイルの位置を表す文字列です。
	 */
	public var source(default,default) : String;
	// }}}
	// {{{ public var onComplete(default, default) : Void -> Void;
	/**
	 * 画像のロードが完了した時に呼び出される関数です。
	 */
	public var onComplete(default, default) : Void -> Void;
	// }}}
	// {{{ public var onError(default, default) : Dynamic -> Void;
	/**
	 * 画像のロード中にエラーが発生した時に呼び出される関数です。
	 */
	public var onError(default, default) : Dynamic -> Void;
	// }}}
	// {{{ public function new( path : String, ?size:UXSize, ?immediate:Bool )
	/**
	 * コンストラクタです。
	 *
	 * @param path: 画像のURL、パスを指定します。
	 * @param size: 画像のサイズを指定します。省略可能です。
	 * @param immediate: 即時表示か load() メソッドによる手動表示かを指定します。デフォルトは即時表示のtrueです。
	 */
	public function new( path : String, ?size:UXSize, ?immediate:Bool )
	{
		if ( immediate==null ) immediate = true;
		state = new UXBasicState();
		state.target = this;
		ctrl = new UXController<UXBasicState>( state );
		super(ctrl);
		try {
			source = path;
			_loader = new flash.display.Loader();
			_loader.contentLoaderInfo.addEventListener( IOErrorEvent.IO_ERROR, errorHandler, false, 0, true );
			_loader.contentLoaderInfo.addEventListener( SecurityErrorEvent.SECURITY_ERROR, errorHandler, false, 0, true );
			_loader.contentLoaderInfo.addEventListener( Event.COMPLETE, getCompleteHandler(size), false, 0, true);
			if ( immediate ) {
				load();
			}
		} catch (err:Dynamic) trace(err);
	}
	// }}}
	// {{{ public function load() : Void
	/**
	 * pathの指定する画像ファイルを読み込みます。
	 */
	public function load() : Void
	{
		_loader.load(new flash.net.URLRequest(source));
	}
	// }}}
	// {{{ function getCompleteHandler(?size: UXSize)

	function getCompleteHandler(?size: UXSize)
	{
		var me = this;
		return function (event) {
			var img = me._loader.content;
			me.addChild(img);
			if (size != null) { img.width = size.width; img.height = size.width; }
			img.x = - img.width / 2;
			img.y = - img.height / 2;
			if ( me.onComplete!=null ) {
				me.onComplete();
			}
		}
	}
	// }}}
	// {{{ public function errorHandler( e:Dynamic ) : Void

	public function errorHandler( e:Dynamic ) : Void
	{
		if ( onError!=null ) onError(e);
	}

	// }}}
}
// }}}
